<?php
class Usuarios_Model_Seguridad extends Model_Cna {

    public function __construct() {
        parent::__construct();
    }

    /**
     * Valida las credenciales de un usuario, y almacena la informacion del usuario en Zend_Auth
     * en caso de ser exitoso
     * @param string $usuario
     * @param string $clave
     * @return boolean true si es exitoso, o false si falla la autenticación
     */
    public function validarUsuario($usuario, $clave) {
        $clave = md5($clave);
        $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
        $authAdapter->setTableName('usuarios')->setIdentityColumn('nombreusuario')->setCredentialColumn('clave');
        $authAdapter->setIdentity($usuario)->setCredential($clave);
        $select = $authAdapter->getDbSelect();
        //FIXME condicionar a que sea de cna y otras cosas necesarias
        $select->where("estado = 1");
        
        
        $auth = Zend_Auth::getInstance();
        $result = $auth->authenticate($authAdapter);
        if($result->isValid()) {
            $userInfo = $authAdapter->getResultRowObject(array(
                "codusuario", "nombreusuario", "nombres", "apellidos"
            ));
            //Zend_Debug::dump($authAdapter->getResultRowObject());die;
            $auth->getStorage()->write($userInfo);
            return true;
        }
        return false;
    }

    /**
     * Consulta la cantidad de accesos que el usuario tiene registrados al sistema.
     * @param int $codusuario
     * @return int Número de accesos del usuario
     */
    public function cantidadAccesos($codusuario) {
        $accesos = new Usuarios_Model_DbTable_Accesos();
        return $accesos->getCountAccesosPorUsuario($codusuario);
    }

    /**
     * Verifica si se ha cumplido el periodo en el que el usuario debe
     * actualizar sus datos de autenticación
     * @param int $codusuario
     * @return boolean
     */
    public function verificarPeriodoClave($codusuario) {
        $salida = false;
        $usuarios = new Usuarios_Model_DbTable_Usuarios();
        $row = $usuarios->find($codusuario)->current();
        $fecha_periodo = $row->fechaperiodo;
        
        //Zend_Debug::dump($fecha_periodo);die;
        $periodo_clave = $row->periodoclave;
        $fecha_actual = new Zend_Date();
//        $fecha_vencimiento = new Zend_Date();
        $fecha_vencimiento = new Zend_Date($fecha_periodo);
        $fecha_vencimiento->add($periodo_clave, Zend_Date::DAY);
        if($fecha_actual->isLater($fecha_vencimiento, Zend_Date::DATES)) {
            $salida = true;
        }
        return $salida;
    }

    /**
     * Actualiza la informacion de clave de usuario.
     * Lanza un Exception si la clave que s eintenta guardar es igual a la actual.
     * @param int $codusuario
     * @param string $clave
     * @return void
     */
    public function actualizarClave($codusuario, $clave) {
        $usuariosTable = new Usuarios_Model_DbTable_Usuarios();
        $row = $usuariosTable->find($codusuario)->current();
        if(md5($clave) == $row->clave) {
            throw new Exception("Actualización no satisfactoria: La nueva clave debe ser diferente de la actual.");
        }
        $row->clave = md5($clave);
        $row->fechaperiodo = new Zend_Db_Expr("sysdate");// new Zend_Date();
        $row->save();
    }

    /**
     * Registra el acceso del usuario en la base de datos con fines de auditoría.
     * @param int $codusuario
     * @param string $ip La IP del usuario que está ingresando al sistema
     */
    public function registrarAcceso($codusuario, $ip) {
        $accesosTable = new Usuarios_Model_DbTable_Accesos();
        $row = $accesosTable->createRow();
        /*$fecha = new Zend_Date ( );
		$row->fechaingreso = $fecha;
		$row->hora = $fecha;*/
        $row->fechaingreso = new Zend_Db_Expr("sysdate");
        //$row->hora = date("H:i");
        $row->codusuario = $codusuario;
        $row->ip = $ip;
        $row->save();
    }

    /**
     * Resetea/limpia las cookies que almacenan las búsquedas,
     * filtros, paginaciones y ordenamientos realizados sobre
     * las tablas que implementan el plugin dataTables de jquery.
     */
    public function resetDataTables() {
        //Zend_Debug::dump($this->getRequest()->getCookie());
        foreach($_COOKIE as $key => $value) {
            if(App_Util_StringUtil::startsWith($key, "SpryMedia_DataTables_")) {
                //        	    Zend_Debug::dump($key);
                setcookie($key, '', time() - 3600, "/");
            }
        }
    }
}//fin de la clase
